package shujia.day15;

/*
    1、自己造一个类，继承Thread类，重写run方法，创建该线程类的对象【线程对象】，启动【启动线程】。

    注意：
        1、为什么要重写run方法？
            一个线程要执行的功能，这个run方法就是每个线程对象启动时要执行的代码逻辑
        2、启动线程千万不要直接调用run方法，因为这和普通的对象调用run方法没有任何区别。
            将来我们将一个线程对象启动后，由系统自动分配资源，创建线程，底层调用对应线程中的run方法代码逻辑
        3、一个进程中多个线程执行之间，具有随机性，抢占式调度，线程启动的瞬间并不是立刻就执行，而是具备了CPU执行的资格
            将来当抢到CPU执行权的时候，才会执行。
        4、线程对象调用start()方法的时候，才算启动，系统创建了一个线程对象，具备了CPU执行的资格，当抢到CPU执行权的时候
            由该线程内部自动调用起对应的run方法代码逻辑，直到未来某一刻某个线程对象中的run方法代码逻辑执行完
            那么这个线程也就死亡了，变成垃圾，等待被回收。
 */
class MyThread1 extends Thread{
    @Override
    public void run() {
        for(int i=1;i<=200;i++){
            System.out.println(i);
        }
    }
}

public class ThreadDemo1 {
    public static void main(String[] args) {
        MyThread1 t1 = new MyThread1(); //创建一个线程对象
        MyThread1 t2 = new MyThread1(); //创建一个线程对象
        MyThread1 t3 = new MyThread1(); //创建一个线程对象

//        t1.run();
//        t2.run();
//        t3.run();

        t1.start();
        t2.start();
        t3.start();

    }
}
